<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <!--
    1. app.message修改数据。 Vue内部是如何监听message的数据的？
    * Object.defineProperty -> 监听对象属性的改变

    2. 当数据发生改变，Vue是如何知道要通知哪些东西，界面发生刷新？
    * 发布订阅者模式
  -->




  <div id="app">
    {{message}}
    {{message}}
    {{message}}
    {{name}}
  </div>
</body>
<script>
  const obj = {
    message: '哈哈哈',
    name: 'saobo'
  }

  Object.keys(obj).forEach(key => {
    let value = obj[key]

    Object.defineProperty(obj, key, {
      set(newValue) {
        console.log('监听' + key + '改变');
        value = newValue
      },
      get() {
        console.log('获取' + key + '对应的值');
        // 嘉然： get -> update
        // 乃琳： get -> update
        // 珈乐： get -> update
        // 嘉然： get -> update
        return value
      }
    })
  })

  // 发布订阅者
  class Dep {
    constructor() {
      this.subscribes = []
    }

    addSub(sub) {

    }
  }
  new Dep()

  class Watcher {
    constructor(name) {
      this.name = name
    }

    update() {
      console.log(this.name + 'update');
    }
  }

</script>


<script src="./node_modules/vue/dist/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      message: '我是废物',
      name:'骚波'
    }
  })
</script>

</html>